<!doctype html>
<html lang="zh-Hans" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default docs-doc-id-action/springfox/springfox4">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="generator" content="Docusaurus v2.0.1">
<link rel="search" type="application/opensearchdescription+xml" title="Knife4j" href="/opensearch.xml">

<!-- Google Tag Manager -->
    <script>!function(e,t,a,n,g){e[n]=e[n]||[],e[n].push({"gtm.start":(new Date).getTime(),event:"gtm.js"});var m=t.getElementsByTagName(a)[0],r=t.createElement(a);r.async=!0,r.src="https://www.googletagmanager.com/gtm.js?id=GTM-TKBX678",m.parentNode.insertBefore(r,m)}(window,document,"script","dataLayer")</script>
    <!-- End Google Tag Manager -->
<script src="/js/custom.js"></script>
<script src="/js/baidu.js"></script>
<script src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1589206801610969" async crossorigin="anonymous"></script><title data-rh="true">springfox 源码分析(四) 配置类初始化 | Knife4j</title><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://doc.xiaominfo.com/docs/action/springfox/springfox4"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="springfox 源码分析(四) 配置类初始化 | Knife4j"><meta data-rh="true" name="description" content="时间：2019-5-23 1250"><meta data-rh="true" property="og:description" content="时间：2019-5-23 1250"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://doc.xiaominfo.com/docs/action/springfox/springfox4"><link data-rh="true" rel="alternate" href="https://doc.xiaominfo.com/docs/action/springfox/springfox4" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://doc.xiaominfo.com/docs/action/springfox/springfox4" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://3CRIMRK623-dsn.algolia.net" crossorigin="anonymous"><link rel="stylesheet" href="/assets/css/styles.66359a73.css">
<link rel="preload" href="/assets/js/runtime~main.e0db172c.js" as="script">
<link rel="preload" href="/assets/js/main.c059fb6e.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function e(e){document.documentElement.setAttribute("data-theme",e)}var t=function(){var e=null;try{e=localStorage.getItem("theme")}catch(e){}return e}();null!==t?e(t):window.matchMedia("(prefers-color-scheme: dark)").matches?e("dark"):window.matchMedia("(prefers-color-scheme: light)").matches?e("light"):e("dark")}()</script><div id="__docusaurus">
<div role="region"><a href="#" class="skipToContent_fXgn">跳到主要内容</a></div><nav class="navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Navigation bar toggle" class="navbar__toggle clean-btn" type="button" tabindex="0"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/knife4j-light.svg" alt="" class="themedImage_ToTc themedImage--light_HNdA"><img src="/img/knife4j-dark.svg" alt="" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">Knife4j</b></a><a class="navbar__item navbar__link" href="/docs/quick-start">文档</a><a class="navbar__item navbar__link changelog" href="/docs/middleware-sources">中间件</a><a class="navbar__item navbar__link changelog" href="/docs/oas">OAS规范</a><a aria-current="page" class="navbar__item navbar__link changelog navbar__link--active" href="/docs/action">实战指南</a><a class="navbar__item navbar__link changelog" href="/docs/changelog">更新日志</a><a class="navbar__item navbar__link changelog" href="/docs/faq">FAQ</a><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">旧版本</a><ul class="dropdown__menu"><li><a class="dropdown__link" target="_blank" href="/v2/index.html">2.0.9</a></li></ul></div></div><div class="navbar__items navbar__items--right"><div class="toggle_MW0i colorModeToggle_x44X"><button class="clean-btn toggleButton_yw5v toggleButtonDisabled_BJd7" type="button" disabled="" title="切换浅色/暗黑模式（当前为暗黑模式）" aria-label="切换浅色/暗黑模式（当前为暗黑模式）"><span><svg viewBox="0 0 13 12" fill="none" xmlns="http://www.w3.org/2000/svg" width="14" height="14" class="lightToggleIcon_SFTY"><g clip-path="url(#clip0_833_8168)"><path d="M6.59998 8.49999C7.98069 8.49999 9.09998 7.3807 9.09998 5.99999C9.09998 4.61928 7.98069 3.49999 6.59998 3.49999C5.21926 3.49999 4.09998 4.61928 4.09998 5.99999C4.09998 7.3807 5.21926 8.49999 6.59998 8.49999Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M6.59985 0.5V1.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M6.59985 10.5V11.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2.7099 2.11L3.4199 2.82" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9.77991 9.17999L10.4899 9.88999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M1.09998 6H2.09998" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M11.0999 6H12.0999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2.7099 9.88999L3.4199 9.17999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9.77991 2.82L10.4899 2.11" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path></g><defs><clipPath id="clip0_833_8168"><rect width="12" height="12" fill="white" transform="translate(0.599976)"></rect></clipPath></defs></svg><svg viewBox="0 0 13 12" width="14" height="14" class="darkToggleIcon_ekgs"><path d="M10.7001 6.39501C10.6215 7.24611 10.3021 8.05721 9.77927 8.7334C9.25646 9.40959 8.55189 9.92291 7.748 10.2133C6.9441 10.5036 6.07414 10.5591 5.2399 10.3731C4.40565 10.187 3.64164 9.76728 3.03726 9.1629C2.43287 8.55851 2.01312 7.7945 1.8271 6.96026C1.64108 6.12602 1.6965 5.25605 1.98688 4.45216C2.27725 3.64826 2.79056 2.94369 3.46675 2.42088C4.14294 1.89808 4.95404 1.57866 5.80515 1.50001C5.30685 2.17414 5.06707 3.00473 5.12941 3.84071C5.19175 4.6767 5.55208 5.46254 6.14485 6.05531C6.73762 6.64808 7.52346 7.0084 8.35944 7.07074C9.19542 7.13308 10.026 6.8933 10.7001 6.39501Z" stroke="currentColor" fill="transparent" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></button></div><a href="https://github.com/xiaoymin/swagger-bootstrap-ui" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link icon" title="View on GitHub">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="searchBox_ZlJk"><button type="button" class="DocSearch DocSearch-Button" aria-label="搜索"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">搜索</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="回到顶部" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/"><img src="/img/knife4j-light.svg" alt="" class="themedImage_ToTc themedImage--light_HNdA"><img src="/img/knife4j-dark.svg" alt="" class="themedImage_ToTc themedImage--dark_i4oU"><b>Knife4j</b></a><nav class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menuHtmlItem_M9Kj menu__list-item">
<div class="sidebar_donate">
    <div class="sidebar_sponsor">
        <a target="_blank" href="https://www.apifox.com/apiskills/apifox-auto-generates-api-docs/?utm_source=pay&utm_medium=knife4jg"><img src="/images/sponsor/apifox/Apifox IDEA@3x.png">
        </a>
    </div>
    <div class="sidebar_sponsor_submit">
        <a href="/docs/community/donate">成为赞助商</a>
    </div>
<div>
</div></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/action">实战指南</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/action/action-simple">示例代码</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/action/mavenbom">Spring 单体架构</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/action/springcloud-gateway">Spring微服务架构</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/action/oauth2-implicit">OAuth2.0</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/action/aggregation-disk">微服务聚合实战</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/action/dotnetcore-knife4j-how">ASP.NET Core</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" href="/docs/action/springfox">Springfox 源码系列</a><button aria-label="打开/收起侧边栏菜单「Springfox 源码系列」" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox1">springfox 源码分析(一) 程序入口</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox2">springfox 源码分析(二) 初探mapstruct</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox3">springfox 源码分析(三) 初探Spring Plugin插件系统</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/action/springfox/springfox4">springfox 源码分析(四) 配置类初始化</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox5">springfox 源码分析(五) web配置类Plugin插件的使用</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox6">springfox 源码分析(六) web配置类扫描包作用探索</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox7">springfox 源码分析(七) 文档初始化</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox8">springfox 源码分析(八) 遍历接口获取Model对象</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox9">springfox 源码分析(九) 文档初始化-分组</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox10">springfox 源码分析(十) 遍历接口获取Model对象</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox11">springfox 源码分析(十一) 自定义添加Swagger Models功能实现</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox12">springfox 源码分析(十二) 遍历接口获取ApiDescription集合</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox13">springfox 源码分析(十三) 自定义扩展实现接口的排序</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox14">springfox 源码分析(十四) 归档得到ApiListing接口集合</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox15">springfox 源码分析(十五) 归档得到Documentation文档对象</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox16">springfox 源码分析(十六) 分组接口swagger-resouces</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox17">springfox 源码分析(十七) Swagger2接口文档示例接口api-docs</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox18">springfox 源码分析(十八) 自定义扩展实现分组的排序</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox19">springfox 源码分析(十九) guava库学习</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox20">springfox 源码分析(二十) 自定义扩展实现Map、JSONObject等动态字段显示</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/action/springfox/springfox21">springfox 源码分析(二十一) 忽略参数Class类型</a></li></ul></li></ul></nav><button type="button" title="收起侧边栏" aria-label="收起侧边栏" class="button button--secondary button--outline collapseSidebarButton_PEFL"><svg width="20" height="20" aria-hidden="true" class="collapseSidebarButtonIcon_kv0_"><g fill="#7a7a7a"><path d="M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"></path><path d="M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"></path></g></svg></button></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_z5aJ"><div class="docItemContainer_c0TR"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="页面路径"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="主页面" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_OVgt"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/docs/action/springfox"><span itemprop="name">Springfox 源码系列</span></a><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">springfox 源码分析(四) 配置类初始化</span><meta itemprop="position" content="2"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">本页总览</button></div><div class="theme-doc-markdown markdown"><h1>springfox 源码分析(四) 配置类初始化</h1><p>时间：2019-5-23 12:46:50</p><p>地点：单位、家中</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="enableswagger2">@EnableSwagger2<a class="hash-link" href="#enableswagger2" title="标题的直接链接">​</a></h2><p>有了二三章的理解,此时我们再来看<code>EnableSwagger2</code>注解的内容</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Target(value = { java.lang.annotation.ElementType.TYPE })</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Documented</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Import({Swagger2DocumentationConfiguration.class})</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">public @interface EnableSwagger2 {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="swagger2documentationconfiguration">Swagger2DocumentationConfiguration<a class="hash-link" href="#swagger2documentationconfiguration" title="标题的直接链接">​</a></h2><p>该注解没啥好说的,最终是导入<code>Swagger2DocumentationConfiguration</code>的配置类</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Configuration</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Import({ SpringfoxWebMvcConfiguration.class, SwaggerCommonConfiguration.class })</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">@ComponentScan(basePackages = {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    &quot;springfox.documentation.swagger2.mappers&quot;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">})</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">@ConditionalOnWebApplication</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">public class Swagger2DocumentationConfiguration {</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>此处的<code>@ComponentScan</code>注解,扫描了<code>springfox.documentation.swagger2.mappers</code>包路径</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="mappers">Mappers<a class="hash-link" href="#mappers" title="标题的直接链接">​</a></h3><p>该包路径下包含了众多运用<code>MapStruct</code>组件自动生成的Mapper实体类转换关系,通过扫描注解,自动注入到Spring的容器中</p><p>关于<code>MapStruct</code>组件的使用,可参考:<a href="https://www.xiaominfo.com/2019/05/22/springfox-2/" target="_blank" rel="noopener">springfox 源码分析(二) 初探mapstruct</a></p><p>主要包括如下：</p><ul><li>LicenseMapper</li><li>ModelMapper</li><li>ParameterMapper</li><li>SecurityMapper</li><li>SerivceModelToSwagger2Mapper</li><li>VendorExtensionsMapper</li></ul><p>每个Mapper接口都有一个实现类MapperImpl，实现类通过<code>@Component</code>注解注入到Spring的容器中</p><p>最重要的是<code>SerivceModelToSwagger2Mapper</code>这个Mapper</p><p>该类的作用会聚合使用Model、Parameter、License等Mapper,将springfox中的对象转化为Swagger标准的对象，包括Swagger</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Generated(</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    value = &quot;org.mapstruct.ap.MappingProcessor&quot;,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    date = &quot;2018-06-23T17:02:57-0500&quot;,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    comments = &quot;version: 1.2.0.Final, compiler: javac, environment: Java 1.8.0_151 (Oracle Corporation)&quot;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Component</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">public class ServiceModelToSwagger2MapperImpl extends ServiceModelToSwagger2Mapper {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    @Autowired</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    private ModelMapper modelMapper;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    @Autowired</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    private ParameterMapper parameterMapper;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    @Autowired</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    private SecurityMapper securityMapper;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    @Autowired</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    private LicenseMapper licenseMapper;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    @Autowired</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    private VendorExtensionsMapper vendorExtensionsMapper;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    @Override</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    public Swagger mapDocumentation(Documentation from) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        if ( from == null ) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            return null;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        Swagger swagger = new Swagger();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        swagger.setVendorExtensions( vendorExtensionsMapper.mapExtensions( from.getVendorExtensions() ) );</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        swagger.setSchemes( mapSchemes( from.getSchemes() ) );</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        swagger.setPaths( mapApiListings( from.getApiListings() ) );</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        swagger.setHost( from.getHost() );</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        swagger.setDefinitions( modelMapper.modelsFromApiListings( from.getApiListings() ) );</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        swagger.setSecurityDefinitions( securityMapper.toSecuritySchemeDefinitions( from.getResourceListing() ) );</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        ApiInfo info = fromResourceListingInfo( from );</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        if ( info != null ) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            swagger.setInfo( mapApiInfo( info ) );</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        swagger.setBasePath( from.getBasePath() );</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        swagger.setTags( tagSetToTagList( from.getTags() ) );</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        List&lt;String&gt; list2 = from.getConsumes();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        if ( list2 != null ) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            swagger.setConsumes( new ArrayList&lt;String&gt;( list2 ) );</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        else {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            swagger.setConsumes( null );</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        List&lt;String&gt; list3 = from.getProduces();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        if ( list3 != null ) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            swagger.setProduces( new ArrayList&lt;String&gt;( list3 ) );</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        else {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            swagger.setProduces( null );</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        return swagger;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //more...</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>各个Mapper组件的映射关系如下：</p><table><thead><tr><th>Mapper</th><th>目标类</th><th></th></tr></thead><tbody><tr><td>LicenseMapper</td><td><code>io.swagger.models.License</code></td><td>通过ApiInfo的属性Lincese构建目标类实体对象</td></tr><tr><td>ModelMapper</td><td><code>io.swagger.models.Model</code></td><td>将<code>springfox.documentation.schema.Model</code>转化成目标类</td></tr><tr><td>ParameterMapper</td><td><code>io.swagger.models.parameters.Parameter</code></td><td>将<code>springfox.documentation.service.Parameter</code>转化成目标类</td></tr><tr><td>SecurityMapper</td><td><code>io.swagger.models.auth.SecuritySchemeDefinition</code></td><td></td></tr><tr><td>ServiceModelToSwagger2Mapper</td><td><code>io.swagger.models.Swagger</code></td><td>输出Swagger完整对象</td></tr><tr><td></td><td></td><td></td></tr></tbody></table><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="springfoxwebmvcconfiguration">SpringfoxWebMvcConfiguration<a class="hash-link" href="#springfoxwebmvcconfiguration" title="标题的直接链接">​</a></h2><p>在<code>Swagger2DocumentationConfiguration</code>源码中,我们看到该Configuration类还引入了<code>SpringfoxWebMvcConfiguration</code>,该类是注入Spring Rest接口相关的配置核心类</p><p>先来看源码:</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Configuration</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Import({ ModelsConfiguration.class })</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">@ComponentScan(basePackages = {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    &quot;springfox.documentation.spring.web.scanners&quot;,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    &quot;springfox.documentation.spring.web.readers.operation&quot;,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    &quot;springfox.documentation.spring.web.readers.parameter&quot;,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    &quot;springfox.documentation.spring.web.plugins&quot;,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    &quot;springfox.documentation.spring.web.paths&quot;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">})</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">@EnablePluginRegistries({ DocumentationPlugin.class,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ApiListingBuilderPlugin.class,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    OperationBuilderPlugin.class,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ParameterBuilderPlugin.class,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ExpandedParameterBuilderPlugin.class,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ResourceGroupingStrategy.class,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    OperationModelsProviderPlugin.class,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    DefaultsProviderPlugin.class,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    PathDecorator.class,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ApiListingScannerPlugin.class</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">})</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">public class SpringfoxWebMvcConfiguration {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  @Bean</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  public Defaults defaults() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    return new Defaults();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  @Bean</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  public DocumentationCache resourceGroupCache() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    return new DocumentationCache();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  @Bean</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  public static ObjectMapperConfigurer objectMapperConfigurer() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    return new ObjectMapperConfigurer();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  @Bean</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  public JsonSerializer jsonSerializer(List&lt;JacksonModuleRegistrar&gt; moduleRegistrars) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    return new JsonSerializer(moduleRegistrars);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  @Bean</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  public DescriptionResolver descriptionResolver(Environment environment) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    return new DescriptionResolver(environment);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  @Bean</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  public HandlerMethodResolver methodResolver(TypeResolver resolver) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    return new HandlerMethodResolver(resolver);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>从源码中我们可以看到：</p><ul><li>使用<code>import</code>导入<code>ModelConfiguration</code>配置类,该类</li><li>使用<code>@ComponentScan</code>注解扫描配置的package包路径,完成Spring的Bean实例注入</li><li>使用<code>@EnablePluginRegistries</code>插件机制来完成插件的动态实例Bean注入到Spring容器中,关于Spring Plugin的使用,不明白的可以参考下上一篇文章对<a href="https://www.xiaominfo.com/2019/05/22/springfox-3/" target="_blank" rel="noopener">Spring Plugin的说明</a></li><li>注入相关Bean的实例对象</li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="modelsconfiguration">ModelsConfiguration<a class="hash-link" href="#modelsconfiguration" title="标题的直接链接">​</a></h3><p>从webmvc配置类导入的Models配置类,我们来看该类的源码</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Configuration</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">@ComponentScan(basePackages = {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    &quot;springfox.documentation.schema&quot;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">})</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">@EnablePluginRegistries({</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ModelBuilderPlugin.class,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ModelPropertyBuilderPlugin.class,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    TypeNameProviderPlugin.class,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    SyntheticModelProviderPlugin.class</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">})</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">public class ModelsConfiguration {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  @Bean</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  public TypeResolver typeResolver() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    return new TypeResolver();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>该类的配置和<code>SpringfoxWebMvcConfiguration</code>配置类相似,作用都是扫描包路径,启用PluginRetry进行Spring的实体Bean动态注入</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="swaggercommonconfiguration">SwaggerCommonConfiguration<a class="hash-link" href="#swaggercommonconfiguration" title="标题的直接链接">​</a></h2><p><code>Swagger2DocumenationConfiguration</code>导入的第二个配置类<code>SwaggerCommonConfiguration</code></p><p>来看代码:</p><p><code>SwaggerCommonConfiguration.java</code></p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Configuration</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">@ComponentScan(basePackages = {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    &quot;springfox.documentation.swagger.schema&quot;,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    &quot;springfox.documentation.swagger.readers&quot;,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    &quot;springfox.documentation.swagger.web&quot;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">})</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">public class SwaggerCommonConfiguration {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>作用和以上类似</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="总结">总结<a class="hash-link" href="#总结" title="标题的直接链接">​</a></h2><p>通过<code>@EnableSwagger2</code>注解,我们看到了三个4个Configuration配置类的导入</p><p>主要作用：</p><ul><li>实体Bean的注入</li><li>Plugin插件的动态Bean注入</li><li>扫描springfox配置的各种package路径</li></ul><p>看到这里相信我们还是一头雾水,我们并没有发现springfox何时初始化接口类的.</p><p>接下来,我们会针对上面Configuration涉及到的Plugin和<code>@CompnentScan</code>扫描package路径进行一一探索.</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"></div><div class="col lastUpdated_vwxv"><span class="theme-last-updated">最后<!-- -->由 <b>xiaoyumin</b> <!-- -->于 <b><time datetime="2022-08-15T15:32:11.000Z">2022年8月15日</time></b> <!-- -->更新</span></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="文档分页导航"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/action/springfox/springfox3"><div class="pagination-nav__sublabel">上一页</div><div class="pagination-nav__label">springfox 源码分析(三) 初探Spring Plugin插件系统</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/action/springfox/springfox5"><div class="pagination-nav__sublabel">下一页</div><div class="pagination-nav__label">springfox 源码分析(五) web配置类Plugin插件的使用</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#enableswagger2" class="table-of-contents__link toc-highlight">@EnableSwagger2</a></li><li><a href="#swagger2documentationconfiguration" class="table-of-contents__link toc-highlight">Swagger2DocumentationConfiguration</a><ul><li><a href="#mappers" class="table-of-contents__link toc-highlight">Mappers</a></li></ul></li><li><a href="#springfoxwebmvcconfiguration" class="table-of-contents__link toc-highlight">SpringfoxWebMvcConfiguration</a><ul><li><a href="#modelsconfiguration" class="table-of-contents__link toc-highlight">ModelsConfiguration</a></li></ul></li><li><a href="#swaggercommonconfiguration" class="table-of-contents__link toc-highlight">SwaggerCommonConfiguration</a></li><li><a href="#总结" class="table-of-contents__link toc-highlight">总结</a></li></ul></div></div></div></div></main></div></div><footer class="footer"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">文档指南</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/quick-start">文档</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/community/simple-demo">示例</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/changelog">更新日志</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/upgrading/upgrading-to-v4">升级到v4.0</a></li></ul></div><div class="col footer__col"><div class="footer__title">社区</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://gitter.im/knife4j/knife4j" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitter<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/question/tag/swagger-bootstrap-ui" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">关注公众号</div><ul class="footer__items clean-list"><li class="footer__item"><img src="/images/website/qrcode.jpg" width="150"></li></ul></div><div class="col footer__col"><div class="footer__title">更多</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://docusaurus.io" target="_blank" rel="noopener noreferrer" class="footer__link-item">Docusaurus<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/xiaoym/knife4j" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/xiaoymin/swagger-bootstrap-ui" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Apache License 2.0 | Copyright © 2018-2023-八一菜刀 浙ICP备18027673号-1 </div></div></div></footer></div>
<script src="/assets/js/runtime~main.e0db172c.js"></script>
<script src="/assets/js/main.c059fb6e.js"></script>
<!-- Google Tag Manager (noscript) -->
    <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-TKBX678" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <!-- End Google Tag Manager (noscript) --></body>
</html>